home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / pbmplus / pgm / pgmramp.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  2KB  |  103 lines

  1. /* pgmramp.c - generate a grayscale ramp
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include "pgm.h"
  14.  
  15. void
  16. main( argc, argv )
  17. int argc;
  18. char *argv[];
  19.     {
  20.     gray *grayrow;
  21.     register gray *gP;
  22.     int rows, cols, rowso2, colso2, row;
  23.     register int col;
  24.     int ramptype;
  25. #define RT_LR 1
  26. #define RT_TB 2
  27. #define RT_RECT 3
  28. #define RT_ELLIP 4
  29.     char *usage = "-lr|-tb|-rectangle|-ellipse <width> <height>";
  30.  
  31.     pgm_init( &argc, argv );
  32.  
  33.     if ( argc != 4 )
  34.     pm_usage( usage );
  35.  
  36.     if ( pm_keymatch( argv[1], "-lr", 2 ) )
  37.     ramptype = RT_LR;
  38.     else if ( pm_keymatch( argv[1], "-tb", 2 ) )
  39.     ramptype = RT_TB;
  40.     else if ( pm_keymatch( argv[1], "-rectangle", 2 ) )
  41.     ramptype = RT_RECT;
  42.     else if ( pm_keymatch( argv[1], "-ellipse", 2 ) )
  43.     ramptype = RT_ELLIP;
  44.     else
  45.     pm_usage( usage );
  46.     
  47.     if ( sscanf( argv[2], "%d", &cols ) != 1 )
  48.     pm_usage( usage );
  49.     if ( sscanf( argv[3], "%d", &rows ) != 1 )
  50.     pm_usage( usage );
  51.  
  52.     colso2 = cols / 2;
  53.     rowso2 = rows / 2;
  54.  
  55.     pgm_writepgminit( stdout, cols, rows, PGM_MAXMAXVAL, 0 );
  56.     grayrow = pgm_allocrow( cols );
  57.  
  58.     for ( row = 0; row < rows; ++row )
  59.     {
  60.     for ( col = 0, gP = grayrow; col < cols; ++col, ++gP )
  61.         {
  62.         switch ( ramptype )
  63.         {
  64.         case RT_LR:
  65.         *gP = col * PGM_MAXMAXVAL / ((cols == 1) ? 1 : (cols - 1));
  66.         break;
  67.  
  68.         case RT_TB:
  69.         *gP = row * PGM_MAXMAXVAL / ((rows == 1) ? 1 : (rows - 1));
  70.         break;
  71.  
  72.         case RT_RECT:
  73.         {
  74.         float r, c;
  75.         r = abs( rowso2 - row ) / (float) rowso2;
  76.         c = abs( colso2 - col ) / (float) colso2;
  77.         *gP = PGM_MAXMAXVAL - ( r + c ) / 2.0 * PGM_MAXMAXVAL;
  78.         }
  79.         break;
  80.  
  81.         case RT_ELLIP:
  82.         {
  83.         float r, c, v;
  84.         r = abs( rowso2 - row ) / (float) rowso2;
  85.         c = abs( colso2 - col ) / (float) colso2;
  86.         v = r * r + c * c;
  87.         if ( v < 0.0 ) v = 0.0;
  88.         else if ( v > 1.0 ) v = 1.0;
  89.         *gP = PGM_MAXMAXVAL - v * PGM_MAXMAXVAL;
  90.         }
  91.         break;
  92.  
  93.         default:
  94.         pm_error( "can't happen" );
  95.         }
  96.         }
  97.     pgm_writepgmrow( stdout, grayrow, cols, PGM_MAXMAXVAL, 0 );
  98.     }
  99.  
  100.     pm_close( stdout );
  101.     exit( 0 );
  102.     }
  103.